package plp.expressions2.expression;

import plp.expressions1.util.Tipo;
import plp.expressions1.util.TipoPrimitivo;
import plp.expressions2.memory.AmbienteCompilacao;
import plp.expressions2.memory.AmbienteExecucao;
import plp.expressions2.memory.VariavelJaDeclaradaException;
import plp.expressions2.memory.VariavelNaoDeclaradaException;

public class ExpLessThan extends ExpBinaria{

	public ExpLessThan(Expressao esq, Expressao dir) {
		super(esq, dir, "<");
	}

	public Valor avaliar(AmbienteExecucao amb)
			throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException {
		ValorConcreto esq = (ValorConcreto) getEsq().avaliar(amb);
		ValorConcreto dir = (ValorConcreto) getDir().avaliar(amb);
		return new ValorBooleano(esq.isLessThan(dir));
	}

	public Tipo getTipo(AmbienteCompilacao amb){
		return TipoPrimitivo.BOOLEANO;
	}

	@Override
	protected boolean checaTipoElementoTerminal(AmbienteCompilacao ambiente){
		return getEsq().getTipo(ambiente).eIgual(getDir().getTipo(ambiente));
	}

	@Override
	public ExpBinaria clone() {
		return new ExpLessThan(esq.clone(), dir.clone());
	}

}
